package model.arbolBSharp.TestsArbol;

import java.io.IOException;
import java.util.Scanner;

import junit.framework.TestCase;

import model.arbolBSharp.ArbolBSharp;
import model.arbolBSharp.ArbolBSharpException;
import model.arbolBSharp.ManipuladorNodos;
import model.arbolBSharp.Hoja;
import model.arbolBSharp.Nodo;
import model.archivo.ArchivoBloques;
import model.registro.RegistroHoja;

public class TestArbolBSharp extends TestCase {

	/**
	 * @param args
	 */
	public void testArbol() {
		ArbolBSharp arbol = new ArbolBSharp(512);
		try {
			arbol.abrir("/home/gustavo/arbolB.dat");
		} catch (ArbolBSharpException e2) {
			// TODO Auto-generated catch block
			e2.printStackTrace();
		}
		for (int i = 0; i <= 1000; i++){
			//reg.setTerm("Ejemplo "+i);
			//reg.setOffset(i);
			try {
				arbol.insertar(new String("Ejemplo: "+i),i,Float.intBitsToFloat(i));
			} catch (ArbolBSharpException e2) {
				// TODO Auto-generated catch block
				e2.printStackTrace();
			}

		}
		/*if(args.length==0){
			System.out.println("Debe especificar el archivo a abrir como parametro");
			return;
		}
		
		File archivo = new File("arbolB.dat");
		
		if(!archivo.exists() || archivo.isDirectory()){
			System.out.println("El archivo no existe o es un directorio");
			return;
		}
		*/
		
		int cantidadNodos = 0;
		Scanner sc = new Scanner(System.in);
		try {
			ManipuladorNodos buffer = new ManipuladorNodos(new ArchivoBloques("/home/gustavo/arbolB.dat", 512));
			System.out.println("INSPECTOR DE NODOS");
			System.out.println(" Ingrese el numero de nodo que desea inspeccionar, o -1 para salir");
			System.out.println("Archivo de arbol abierto con exito");
			cantidadNodos = (int) buffer.getCatidadNodos();
			System.out.println("Cantidad de nodos: " + cantidadNodos);			
			int nodo;
			System.out.print(">");
			while((nodo=sc.nextInt())!=-1){
				if(nodo>=cantidadNodos){
					System.out.println("No existe ese nodo en el archivo");
				} else {
					try{
						imprimirNodo(buffer.leerNodo(nodo));
					}catch(ArbolBSharpException a){
						try{
						imprimirHoja(buffer.leerHoja(nodo));
						}catch(ArbolBSharpException b){
							b.printStackTrace();
						}
					}
				}
				System.out.print(">");
			}
		} catch (IOException e1) {
			e1.printStackTrace();
		} catch (ArbolBSharpException e) {
			e.printStackTrace();
		}
	}
	
	private static void imprimirHoja(Hoja leerHoja) {
		System.out.println("Tipo de nodo: hoja");
		System.out.println("Numero de nodo: " + leerHoja.getPosicionEnArchivo());
		System.out.println("Nivel: 0");
		System.out.println("Cantidad de registros: " + leerHoja.cantidadRegistros());
		
		if(leerHoja.getPunteroASiguiente()==null){
			System.out.println("Siguiente hoja: ninguna");			
		} else {
			System.out.println("Siguiente hoja: " + leerHoja.getPunteroASiguiente());
		}		
		System.out.println("Listado de terminos:");
		for(RegistroHoja registro : leerHoja.getListaRegistroHoja())
			System.out.print("(" + leerHoja.getPalabra(registro) + ", "  + registro.getOffset() + ") ");
		System.out.println("\n");
	}

	private static void imprimirNodo(Nodo leerNodo) {
		System.out.println("Tipo de nodo: no hoja");
		System.out.println("Numero de nodo: " + leerNodo.getPosicionEnArchivo());
		System.out.println("Nivel: " + leerNodo.getNivel());
		System.out.println("Cantidad de prefijos: " + leerNodo.cantidadPrefijos());

		System.out.println("Listado de prefijos:");
		for(int i=0; i<leerNodo.getListaClaves().size(); i++){
			System.out.print(leerNodo.getListaPunteros().get(i) + " ");
			System.out.print(leerNodo.getListaClaves().get(i) + " \n");			
		}
		System.out.println("\n");		
	}
}
